/*!
 *file name : led_drv.c
 *author :hu
 *
 *description:驱动层，需根据硬件做修改
 */
#include "led_drv.h"  



/*!
 *
 *说明：设置所有段电平高。
 *参数：
 *返回值：
 */
void segAllPinHigh()
{
	UINT8 segIndex;
	for(segIndex=0;segIndex<7;segIndex++)
	{
		setSegPin(segIndex,1);
	}


}

/*!
 *
 *说明：数码管扫描,采用段扫描，不管有多少个数码管，都仅需要以7为周期扫描
		定时器中执行
 *参数：
 *返回值：
 */
void ledScan(UINT16 *pLevelData,UINT8 ledNum)
{
	static int segment=0;
	segAllPinHigh();//设置七段数码管输出高	
	setSegPin(segment,0);//扫描其中一段，拉低
	ledDis(pLevelData[segment],ledNum);//点亮或熄灭16位数码管的该段

	segment++;
	if(segment>=SEG_NUM)//循环
	{
		segment=0;
	}
}

/**
********* 上述函数的展开版本(7段数码管为例)
**/
void ledDis(UINT16 levelData,UINT8 ledNum)
{
	static int segment=SEG_A;
	segAllPinHigh();//设置七段数码管输出高

	switch(segment)
	{
		case SEG_A://扫A段时			
			setSegPin(SEG_A,0);//设置A段数码管输出低	
			ledDis(pLevelData[SEG_A],ledNum);
			segment++;
			break;
		case SEG_B:
			setSegPin(SEG_B,0);//设置B段数码管输出低	
			ledDis(pLevelData[SEG_B],ledNum);		
			segment++;
			break;
		case SEG_C:
			setSegPin(SEG_C,0);//设置C段数码管输出低	
			ledDis(pLevelData[SEG_C],ledNum);
			segment++;
			break;
		case SEG_D:
			setSegPin(SEG_D,0);//设置D段数码管输出低	
			ledDis(pLevelData[SEG_D],ledNum);
			segment++;
			break;			
		case SEG_E:
			setSegPin(SEG_E,0);//设置E段数码管输出低	
			ledDis(pLevelData[SEG_E],ledNum);
			segment++;
			break;
		case SEG_F:
			setSegPin(SEG_F,0);//设置F段数码管输出低
			ledDis(pLevelData[SEG_F],ledNum);
			segment++;
			break;
		case SEG_G:
			setSegPin(SEG_G,0);//设置G段数码管输出低
			ledDis(pLevelData[SEG_G],ledNum);
			segment=SEG_A;
			break;
		default:
			break;
	}
}



/*!
 *
 *说明：转换，将数码管显示，转换成电平数据，此函数几十毫秒执行一次即可，刷新数码管显示内容。
 *参数：pLedShowData 16个数码管显示数据数组  pLevelData
 *返回值：
 */
void showConversion(UINT8 pLedShowData,UINT8 pLevelData,UINT8 ledNum)
{
	UINT8 segIndex,ledIndex;
	for(segIndex=0;segIndex<SEG_NUM;segIndex++)
	{
		pLevelData[segIndex];
		for(ledIndex=0;ledIndex<ledNum;ledIndex++)
		{
			pLevelData[segIndex] |= (pLedShowData[ledIndex]>>segIndex & 0x01)<<ledIndex;
			
		}
	}
}